﻿
// ===============================================================================
// FAS低代码开发平台
// 数据访问引擎元数据：通通用模型。
// 数据访问引擎面向CDO、DQ、查询平台等模块提供统一的数据访问服务。为了统一数据访问接口，
// 抽象封装出一种通用的中间结构，各个模块只需将构造好的通用中间结构以参数的形式放到数据访问请求中。
// 数据访问引擎解析通用中间结构，提供统一的数据访问服务
// ===============================================================================
// 变更历史纪录
// 日期			版本	修改人	描述
// 2021.8.24    1.0		周国庆	初稿。
// ===============================================================================
using System;
using System.Collections.Generic;
using System.Text;

namespace T.FAS.Runtime.DataAccess.SPI
{
    /// <summary>
    /// 数据访问引擎内置通用模型
    /// </summary>
    [Serializable]
    public class CommonModel : ICloneable
    {      
        #region 字段

        /// <summary>
        /// 根节点
        /// </summary> 
        private CommonModelNode rootNode;

        #endregion

        #region 构造函数

        /// <summary>
        /// 构造函数
        /// </summary>
        public CommonModel()
        {
            Nodes = new List<CommonModelNode>();
            ExtendProperties = new Dictionary<string, object>();
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="id">标识</param><remarks>唯一标识，BO的唯一标识/VO的唯一标识/其他</remarks>
        /// <param name="name">名称</param>
        /// <param name="type">类型</param>
        public CommonModel(string id, string name, CommonModelType type)
            : this()
        {
            ID = id;
            Name = name;
            Type = type;
        }

        #endregion

        #region 属性

        /// <summary>
        /// 标识
        /// </summary>        
        public string ID { get; set; }

        /// <summary>
        /// 编号
        /// </summary>        
        public string Code { get; set; }

        /// <summary>
        /// 名称
        /// </summary>        
        public string Name { get; set; }

        /// <summary>
        /// 通用中间对象类型
        /// </summary>        
        public CommonModelType Type { get; set; }

        /// <summary>
        /// 是否逻辑删除,True:是，false:否
        /// </summary>
        public bool IsLogicDelete { get; set; }        

        /// <summary>
        /// 根节点
        /// </summary>        
        public virtual CommonModelNode RootNode
        {
            get
            {
                return rootNode;
            }
            set
            {
                rootNode = value;
                rootNode.IsRootNode = true;
            }
        }

        /// <summary>
        /// 节点对象集合
        /// </summary>        
        public virtual List<CommonModelNode> Nodes { get; set; } = new List<CommonModelNode>();        

        /// <summary>
        /// 预留的扩展属性
        /// </summary>
        public Dictionary<string, object> ExtendProperties { get; set; }      

        /// <summary>
        /// 当前版本
        /// </summary>
        public string Version { get; set; }

        #endregion

        #region 方法

        /// <summary>
        /// 创建通用中间对象的副本
        /// </summary>
        /// <returns>通用中间对象的副本</returns>
        public virtual object Clone()
        {
            var newObj = MemberwiseClone() as CommonModel;          

            return newObj;
        }

        /// <summary>
        /// 重载ToString方法
        /// </summary>
        /// <remarks>
        /// 方便调试
        /// </remarks>
        /// <returns>CO通用中间对象概述</returns>
        public override string ToString()
        {
            return string.Format("ID: {0}, Name: {1}, RootNode: {2}, Nodes: {3}", ID, Name, RootNode.Code, Nodes.Count);
        }

        #endregion
    }
}
